(function () {
  var DE = window.DiscourseEmbed || {};
  var comments = document.getElementById("discourse-comments");
  var iframe = document.createElement("iframe");

  [
    "discourseUrl",
    "discourseEmbedUrl",
    "discourseUserName",
    "discourseReferrerPolicy",
  ].forEach(function (i) {
    if (window[i]) {
      DE[i] = DE[i] || window[i];
    }
  });

  var queryParams = {};

  if (DE.discourseEmbedUrl) {
    if (DE.discourseEmbedUrl.startsWith("/")) {
      console.error(
        "discourseEmbedUrl must be a full URL, not a relative path"
      );
    }

    queryParams.embed_url = encodeURIComponent(DE.discourseEmbedUrl);
  }

  if (DE.discourseUserName) {
    queryParams.discourse_username = DE.discourseUserName;
  }

  if (DE.topicId) {
    queryParams.topic_id = DE.topicId;
  }

  if (DE.className) {
    queryParams.class_name = DE.className;
  }

  var src = DE.discourseUrl + "embed/comments";
  var keys = Object.keys(queryParams);
  if (keys.length > 0) {
    src += "?";

    for (var i = 0; i < keys.length; i++) {
      if (i > 0) {
        src += "&";
      }

      var k = keys[i];
      src += k + "=" + queryParams[k];
    }
  }

  iframe.src = src;
  iframe.id = "discourse-embed-frame";
  iframe.width = "100%";
  iframe.frameBorder = "0";
  iframe.scrolling = "no";
  iframe.referrerPolicy =
    DE.discourseReferrerPolicy || "no-referrer-when-downgrade";
  comments.appendChild(iframe);

  // Thanks http://amendsoft-javascript.blogspot.ca/2010/04/find-x-and-y-coordinate-of-html-control.html
  function findPosY(obj) {
    var top = 0;
    if (obj.offsetParent) {
      while (1) {
        top += obj.offsetTop;
        if (!obj.offsetParent) break;
        obj = obj.offsetParent;
      }
    } else if (obj.y) {
      top += obj.y;
    }
    return top;
  }

  function normalizeUrl(url) {
    return url.replace(/^https?(\:\/\/)?/, "");
  }

  function postMessageReceived(e) {
    if (!e) {
      return;
    }
    if (!normalizeUrl(DE.discourseUrl).includes(normalizeUrl(e.origin))) {
      return;
    }

    if (e.data) {
      if (e.data.type === "discourse-resize" && e.data.height) {
        iframe.height = e.data.height + "px";
      }

      if (e.data.type === "discourse-scroll" && e.data.top) {
        // find iframe offset
        var destY = findPosY(iframe) + e.data.top;
        window.scrollTo(0, destY);
      }
    }
  }
  window.addEventListener("message", postMessageReceived, false);
})();
